package student.object.finalize;

/*
    不建议用finalize方法完成“非内存资源”的清理工作，会使GC步骤变的复杂，时间更长
    但建议用于：① 清理本地对象(通过JNI创建的对象)；
              ② 作为确保某些非内存资源(如Socket、文件等)释放的一个补充：在finalize方法中显式调用其他资源释放方法。其原因可见下文[finalize的问题]
 */
public class FinalizeMethod {

    public static FinalizeMethod Fin = null;

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize run !");
        // 通过finalize救赎一次，仅能一次
        FinalizeMethod.Fin = this;
        // 任何异常会被忽略掉
        throw new RuntimeException("我就是想试试看");
    }

    public void isAlive() {
        System.out.println("I am alive");
    }

    public static void main(String[] args) throws Exception {
        Fin = new FinalizeMethod();
        // 第一次自我毁灭
        Fin = null;
        System.gc();
        Thread.sleep(500);
        if (Fin != null) {
            Fin.isAlive();
        } else {
            System.out.println("I am dead!");
        }

        // 第二次自我毁灭
        Fin = null;
        System.gc();
        Thread.sleep(500);
        if (Fin != null) {
            Fin.isAlive();
        } else {
            System.out.println("I am dead!");
        }

    }
}
